package scripts.salidasDeRobots;

import org.apache.log4j.Logger;

public class PosicionamientosRobots extends PosicionamientoSegundoAtaque{

	Logger logger = Logger.getLogger( this.getClass());
	
	/* CUADRANTES
	 *      _________
	 *     |  2 | 3  | 
	 *     |____|____|      
	 *     |  1 |  4 |   
	 *     |____|____| 
	 */
	
	// Metodo que devuelve el posicionamiento de los robots en el cuadrante Uno
	public String posicionamientoCuadranteUno(){
		String resultado = null;
		logger.info( "Comienzo a armar posicionamiento de salidas de cuadrante Uno" );
		
		resultado = "// POSISIONAMIENTO CUADRANTE 1\n" + 
					"posicionCuadranteUno() {\n" + 
					"\tnew float:direccionActual = getDirection()\n" + 
					"\tnew float:diferencia = 0.0\n" + 
					"\tnew float:rotacion = 0.0\n" + 
					"\tif ((direccionActual >= (Pi/4)) && (direccionActual <= ((5*Pi)/4))){\n" + 
					"\t\tdiferencia = (direccionActual - (Pi/4))\n" + 
					"\t\trotacion = direccionActual - diferencia\n" + 
					"\t\trotate(rotacion)\n" + 
					"\t} else {\n" + 
					"\t\tif ((direccionActual > ((5*Pi)/4)) && (direccionActual <= (2*Pi))){\n" + 
					"\t\t\tdiferencia = (2*Pi - direccionActual + (Pi/4))\n" + 
					"\t\t\trotacion = direccionActual + diferencia\n" + 
					"\t\t\trotate(rotacion)\n" + 
					"\t\t} else {\n" + 
					"\t\t\tif ((direccionActual > 0) && (direccionActual < (Pi/4))){\n" + 
					"\t\t\t\tdiferencia = ((Pi/4) - direccionActual)\n" + 
					"\t\t\t\trotacion = direccionActual + diferencia\n" + 
					"\t\t\t\trotate(rotacion)\n" + 
					"\t\t\t}\n" + 
					"\t\t}\n" + 
					"\t}\n" + 
					"}\n";
		logger.info( "Termino de armar posicionamiento de salidas de cuadrante Uno" );
		//logger.debug(resultado);
		return resultado;
	}
	
	
	// Metodo que devuelve el posicionamiento de los robots en el cuadrante Dos
	public String posicionamientoCuadranteDos(){
		String resultado = null;
		logger.info( "Comienzo a armar posicionamiento de salidas de cuadrante Dos" );
		
		resultado = "// POSISIONAMIENTO CUADRANTE 2\n" + 
					"posicionCuadranteDos() {\n" + 
					"\tnew float:direccionActual = getDirection()\n" + 
					"\tnew float:diferencia = 0.0\n" + 
					"\tnew float:rotacion = 0.0\n" + 
					"\t	if ((direccionActual >= ((3*Pi)/4)) && (direccionActual <= ((7*Pi)/4))){\n" + 
					"\t\tdiferencia = (((7*Pi)/4) - direccionActual)\n" + 
					"\t\trotacion = direccionActual + diferencia\n" + 
					"\t\trotate(rotacion)\n" + 
					"\t} else {\n" + 
					"\t\tif ((direccionActual >= 0) && (direccionActual < ((3*Pi)/4))){\n" + 
					"\t\t\tdiferencia = (2*Pi - ((7*Pi)/4) + direccionActual)\n" + 
					"\t\t\trotacion = direccionActual - diferencia\n" + 
					"\t\t\trotate(rotacion)\n" + 
					"\t\t} else {\n" + 
					"\t\t\tif ((direccionActual > ((7*Pi)/4)) && (direccionActual < (2*Pi))){\n" + 
					"\t\t\t\tdiferencia = (direccionActual - ((7*Pi)/4))\n" + 
					"\t\t\t\trotacion = direccionActual - diferencia\n" + 
					"\t\t\t\trotate(rotacion)\n" + 
					"\t\t\t}\n" + 
					"\t\t}\n" + 
					"\t}\n" + 
					"}\n";
		
		logger.info( "Termino de armar posicionamiento de salidas de cuadrante Dos" );
		//logger.debug(resultado);
		return resultado;
	}	
	
	
	// Metodo que devuelve el posicionamiento de los robots en el cuadrante Tres
	public String posicionamientoCuadranteTres(){
		String resultado = null;
		logger.info( "Comienzo a armar posicionamiento de salidas de cuadrante Tres" );
		
		resultado = "// POSISIONAMIENTO CUADRANTE 3\n" + 
					"posicionCuadranteTres() {\n" + 
					"\tnew float:direccionActual = getDirection()\n" + 
					"\tnew float:diferencia = 0.0\n" + 
					"\tnew float:rotacion = 0.0\n" + 
					"\tif ((direccionActual >= (Pi/4)) && (direccionActual <= ((5*Pi)/4))){\n" + 
					"\t\tdiferencia = (((5*Pi)/4) - direccionActual)\n" + 
					"\t\trotacion = direccionActual + diferencia\n" + 
					"\t\trotate(rotacion)\n" + 
					"\t} else {\n" + 
					"\t\tif ((direccionActual > ((5*Pi)/4)) && (direccionActual <= (2*Pi))){\n" + 
					"\t\t\tdiferencia = (direccionActual - ((5*Pi)/4))\n" + 
					"\t\t\trotacion = direccionActual - diferencia\n" + 
					"\t\t\trotate(rotacion)\n" + 
					"\t\t} else {\n" + 
					"\t\t\tif ((direccionActual > 0) && (direccionActual < (Pi/4))){\n" + 
					"\t\t\t\tdiferencia = (((5*Pi)/4) - direccionActual)\n" + 
					"\t\t\t\trotacion = direccionActual + diferencia\n" + 
					"\t\t\t\trotate(rotacion)\n" + 
					"\t\t\t}\n" + 
					"\t\t}\n" + 
					"\t}\n" + 
					"}\n";
		
		logger.info( "Termino de armar posicionamiento de salidas de cuadrante Tres" );
		//logger.debug(resultado);
		return resultado;
	}
	
	
	// Metodo que devuelve el posicionamiento de los robots en el cuadrante Cuatro
	public String posicionamientoCuadranteCuatro(){
		String resultado = null;
		logger.info( "Comienzo a armar posicionamiento de salidas de cuadrante Cuatro" );
		
		resultado = "posicionCuadranteCuatro() {\n" + 
					"\tnew float:direccionActual = getDirection()\n" + 
					"\tnew float:diferencia = 0.0\n" + 
					"\tnew float:rotacion = 0.0\n" + 
					"\tif ((direccionActual >= ((3*Pi)/4)) && (direccionActual <= ((7*Pi)/4))){\n" + 
					"\t\tdiferencia = (direccionActual - ((3*Pi)/4))\n" + 
					"\t\trotacion = direccionActual - diferencia\n" + 
					"\t\trotate(rotacion)\n" + 
					"\t} else {\n" + 
					"\t\tif ((direccionActual >= 0) && (direccionActual < ((3*Pi)/4))){\n" + 
					"\t\t\tdiferencia = (((3*Pi)/4) - direccionActual)\n" + 
					"\t\t\trotacion = direccionActual + diferencia\n" + 
					"\t\t\trotate(rotacion)\n" + 
					"\t\t} else {\n" + 
					"\t\t\tif ((direccionActual > ((7*Pi)/4)) && (direccionActual < (2*Pi))){\n" + 
					"\t\t\t\tdiferencia = (2*Pi - (direccionActual - ((3*Pi)/4)))\n" + 
					"\t\t\t\trotacion = direccionActual + diferencia\n" + 
					"\t\t\t\trotate(rotacion)\n" + 
					"\t\t\t}\n" + 
					"\t\t}\n" + 
					"\t}\n" + 
					"}\n";
		
		logger.info( "Termino de armar posicionamiento de salidas de cuadrante Cuatro" );
		//logger.debug(resultado);
		return resultado;
	}	
	
	// POSICIONAMIENTO DE LA PRIMERA OLEADA DE ATAQUE
	private String posicionPrimerAtaque(){
		String resultado = null;
		
		resultado = "\t// CONSTANTE PARA EL CAMBIO DE DIRECCION PARA EVITAR UNA PARED\n" + 
					"\tnew const float:evitarPared = 1.51415\n" + 
					"\t// ROTACION DE LA CABEZA PARA BUSCAR ENEMIGOS\n" + 
					"\tnew float:rotacionCabeza = 1.047\n" + 
					"\tnew float:jefeX = 54.0\n" + 
					"\tnew float:jefeY = 54.0\n" + 
					"\tnew bool:posicionado = false	\n\n" + 	
					"\t// -----------------------------------\n" + 
					"\t// POSICIONAMIENTO DE LA PRIMERA OLEADA DE ATAQUE\n" + 
					"\tnew float:ejeX\n" + 
					"\tnew float:ejeY\n" + 
					"\tgetLocation(ejeX, ejeY)   \n" + 
					"\tnew float:absEjeX = abs(ejeX) \n" + 
					"\tnew float:absEjeY = abs(ejeY)   	\n" + 
					"\tif (((absEjeX <= jefeX) && (absEjeY <= jefeY)) || (getID() == 0)){\n" + 
					"\t\tif ((ejeX < 0) && (ejeY < 0)){ // ESTAN EN EL CUADRANTE 1 DEL MAPA\n" + 
					"\t\t\tposicionCuadranteUno()\n" + 
					"\t\t\tposicionado = true\n" + 
					"\t\t} else {\n" + 
					"\t\t\tif ((ejeX < 0) && (ejeY > 0)){   // ESTAN EN EL CUADRANTE 2\n" + 
					"\t\t\t\t// VER PARA QUE LADO CONVIENE GIRAR MEJOR\n" + 
					"\t\t\t\tposicionCuadranteDos()\n" + 
					"\t\t\t\tposicionado = true\n" + 
					"\t\t\t} else{\n" + 
					"\t\t\t\tif ((ejeX > 0) && (ejeY > 0)) {  // ESTAN EN EL CUADRANTE 3\n" + 
					"\t\t\t\t\t// VER PARA QUE LADO CONVIENE GIRAR MEJOR\n" + 
					"\t\t\t\t\tposicionCuadranteTres()\n" + 
					"\t\t\t\t\tposicionado = true\n" + 
					"\t\t\t\t} else {\n" + 
					"\t\t\t\t\tif ((ejeX > 0) && (ejeY < 0)) { // ESTAN EN EL CUADRANTE 4\n" + 
					"\t\t\t\t\t\t// VER PARA QUE LADO CONVIENE GIRAR MEJOR\n" + 
					"\t\t\t\t\t\tposicionCuadranteCuatro()\n" + 
					"\t\t\t\t\t\tposicionado = true\n" + 
					"\t\t\t\t\t}\n" + 
					"\t\t\t\t}\n" + 
					"\t\t\t}\n" + 
					"\t\t}\n" + 
					"\t}\n";
		logger.info("Termino de Armar POSICIONAMIENTO DE LA PRIMERA OLEADA DE ATAQUE");
		//logger.debug(resultado);
		
		return resultado;
	}
	
	// espera que los robots de la primer ola de ataque se posicionen
	private String esperaRotacionPrimerAtaque(){
		String esperaRotacion = null;
		
		esperaRotacion = "\tif (posicionado == true){ // ESPERO QUE TERMINE EL GIRO DE LA SEGUNDA OLA DE ATAQUE\n" + 
						"\t\twait(2.0)\n" + 
						"\t\twalk()\n" + 
						"\t\twait(0.04)\n" + 
						"\t\trun()\n" + 
						"\t\twait(0.5)\n" + 
						"\t}\n";
		
		return esperaRotacion;
	}
	
	public String armarRobotito(){
		String robotito = null;
		logger.info("Comienzo a armar robotito");
		robotito = posicionPrimerAtaque() + esperaRotacionPrimerAtaque() + this.armarSegundoAtaque();
		
		logger.info("Termine de armar robotito");
		return robotito;
	}
	
	
	
	
}
